from flask import Flask, render_template, send_from_directory
import os
from fontTools.ttLib import TTFont

app = Flask(__name__)

# 获取static目录的绝对路径
STATIC_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static')

def get_font_name(font_path):
    """
    从字体文件中提取字体名称，优先返回 Windows 下的中文名称。
    若无中文名称，则退回到英文名称；若都失败，则返回文件名。
    支持 .ttf 和 .otf 文件。
    """
    # 获取文件名（不含扩展名）作为兜底
    fallback_name = os.path.splitext(os.path.basename(font_path))[0]

    # 只处理 TTF/OTF 文件
    if not font_path.lower().endswith(('.ttf', '.otf')):
        return fallback_name

    try:
        font = TTFont(font_path)
        name_table = font['name']

        # 定义候选名称：优先级顺序
        chinese_name = None
        english_name = None

        for record in name_table.names:
            if record.nameID == 4:  # Full Name
                try:
                    name_str = record.toStr()  # 自动处理平台和编码
                except:
                    continue

                # Windows 平台 + 中文语言 (0x0804 简体, 0x0404 繁体, 0x0C04 香港等)
                if record.platformID == 3:  # Windows
                    if record.langID in (0x0804, 0x0404, 0x0C04, 0x1004):
                        chinese_name = name_str
                        break  # 中文优先，找到即返回
                    elif not english_name and record.langID == 0x0409:  # 英文 (en-US)
                        english_name = name_str
                # 可选：Mac 中文 (较少见)
                elif record.platformID == 1 and record.langID == 0x40C:
                    chinese_name = name_str

        # 返回优先级：中文 > 英文 > 文件名
        if chinese_name:
            return chinese_name
        if english_name:
            return english_name
        return fallback_name

    except Exception as e:
        print(f"解析字体文件失败 {font_path}: {e}")
        return fallback_name

@app.route('/')
def index():
    # 获取resources文件夹中的所有字体文件
    resources_folder = os.path.join(STATIC_FOLDER, 'resources')
    fonts_data = []
    if os.path.exists(resources_folder):
        # 过滤常见的字体文件扩展名
        font_extensions = ['.ttf', '.otf', '.woff', '.woff2', '.eot']
        font_files = [f for f in os.listdir(resources_folder) if any(f.lower().endswith(ext) for ext in font_extensions)]
        # 为每个字体文件提取实际字体名称
        for font_file in font_files:
            font_path = os.path.join(resources_folder, font_file)
            font_name = get_font_name(font_path)
            fonts_data.append({
                'filename': font_file,
                'name': font_name
            })
    return render_template('index.html', fonts_data=fonts_data)

@app.route('/static/resources/<path:filename>')
def serve_font(filename):
    # 提供字体文件的访问
    return send_from_directory(os.path.join(STATIC_FOLDER, 'resources'), filename)

if __name__ == '__main__':
    # 确保templates目录存在
    templates_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
    if not os.path.exists(templates_dir):
        os.makedirs(templates_dir)
    
    app.run(debug=True, host='0.0.0.0', port=5001)